package mj.scott.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import mj.scott.common.utils.OSSUtil;
import mj.scott.common.utils.WxQrCodeUtil;
import mj.scott.mapper.TableInfoMapper;
import mj.scott.pojo.entity.TableInfo;
import mj.scott.service.ITableInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class TableInfoServiceImpl extends ServiceImpl<TableInfoMapper, TableInfo> implements ITableInfoService {

    @Autowired
    private OSSUtil ossUtil;

    /**
     * 新增桌号逻辑：
     * 1. 生成唯一桌号（如：桌号1、桌号2...）
     * 2. 生成包含桌号ID的二维码
     * 3. 上传二维码到OSS，获取URL
     * 4. 保存桌号信息到数据库
     */
    @Override
    @Transactional
    public TableInfo addTable() {
        try {
            // 1. 生成唯一桌号（查询当前最大桌号，自增1）
            LambdaQueryWrapper<TableInfo> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.orderByDesc(TableInfo::getTableNumber);
            queryWrapper.last("LIMIT 1");
            TableInfo lastTable = this.getOne(queryWrapper);

            int nextNum = 1;
            if (lastTable != null) {
                String lastNumber = lastTable.getTableNumber(); // 如"桌号3"
                nextNum = Integer.parseInt(lastNumber.replace("桌号", "")) + 1;
            }
            String tableNumber = "桌号" + nextNum;

            // 2. 保存桌号信息到数据库（获取ID）
            TableInfo tableInfo = new TableInfo();
            tableInfo.setTableNumber(tableNumber);
            tableInfo.setStatus(1);
            this.save(tableInfo);

            // 3. 生成微信小程序码（关键修改）
            String scene = "table:" + tableInfo.getId(); // 传递桌号ID
            byte[] qrBytes = WxQrCodeUtil.generateWxQrCode(
                    "wxb3cc8e8ec3b17c75",
                    "94039c16822916b35695778b4bd2c9b5",
                    scene
            );

            // 4. 上传到OSS并更新URL
            String fileName = "wx_qrcode/table_" + tableInfo.getId() + ".png";
            String qrCodeUrl = ossUtil.upload(qrBytes, fileName);
            tableInfo.setQrCodeUrl(qrCodeUrl);
            this.updateById(tableInfo);

            return tableInfo;
        } catch (Exception e) {
            throw new RuntimeException("新增桌号失败：" + e.getMessage());
        }
    }

    /**
     * 删除桌号逻辑：
     * 1. 从数据库查询桌号信息（获取二维码URL）
     * 2. 删除OSS上的二维码图片
     * 3. 从数据库删除桌号记录
     */
    @Override
    @Transactional
    public void deleteTable(Long id) {
        // 1. 查询桌号信息
        TableInfo tableInfo = this.getById(id);
        if (tableInfo == null) {
            throw new RuntimeException("桌号不存在");
        }

        // 2. 删除OSS上的二维码图片（URL格式：https://bucketName.endpoint/qrcode/桌号1.png，截取文件名）
        String qrCodeUrl = tableInfo.getQrCodeUrl();
        String fileName = qrCodeUrl.substring(qrCodeUrl.lastIndexOf("/") + 1); // 截取"qrcode/桌号1.png"
        ossUtil.deleteFile(fileName);

        // 3. 删除数据库记录
        this.removeById(id);
    }
}